#pragma once

#include <opencv2/opencv.hpp>
#include "opencv2/core.hpp"

using namespace std;
using namespace cv;

#define REDENEMY 2
#define BLUEENEMY 0

class ArmorPlate
{
public:
    //元素
    ArmorPlate();
    ~ArmorPlate();  //析构函数

    int enemy_color;
    Mat src_image;              //获取的原图像
    Mat img;                    //深度拷贝用
    float P_yaw;                //yaw值
    float P_pitch;              //pitch值
    unsigned int  armor_width;          //装甲板的宽度
    unsigned int armor_height;         //装甲板的高度
    unsigned int light_width;           //灯条的宽度
    unsigned int light_height;          //灯条的高度
    Point2f armor_center;       //装甲板的中心点
    Point2f armor_point[4];     //装甲板的四个角点(用这个)

    vector<Point2f> armor_point_last;  //装甲板的四个角点(顺时针排序)

    void autoArmorPlate();       //找装甲板

private:
    Mat B_R;                //提取颜色通道
    Mat th_b;               //二值化处理
    Mat resultG;            //滤波完成后的图像
    bool light_flag = true;        //灯条宽高比判断标志(默认是正常的)

    vector<Mat> channels;
    vector<vector<Point>> contours;
    vector<RotatedRect> Lrect;      //定义灯条中心点vector
    vector<vector<Point2f>> B_points;        //定义装甲板点位矩形变量

    double dis(Point p1, Point p2);         //求两点距离
    double distanceSquared(const Point2f &p1, const Point2f &p2);
    Point2f calculateCenter(const Point2f points[4]);
    double calculateAngle(const Point2f &point, const Point2f &center);
    bool compareByAngle(const Point2f &p1, const Point2f &p2, const Point2f &center);
    vector<Point2f> sortPointsClockwise(const Point2f points[4]);

    void imgPreprocessor(Mat& image);      //装甲板预处理
};
